home *** CD-ROM | disk | FTP | other *** search
- #include <Fonts.h>
- #include <Movies.h>
- #include <QD3D.h>
- #include <QD3DCamera.h>
- #include <QD3DTransform.h>
-
- OSErr addTweenEntryToSample(QTAtomContainer tweenSample, long tweenID, long tweenType,
- void *tweenData, long tweenDataSize);
-
- OSErr setTweenEntryStartOffset(QTAtomContainer tweenSample, long tweenID, TimeValue startOffset);
-
- OSErr setTweenEntryDuration(QTAtomContainer tweenSample, long tweenID, TimeValue duration);
-
- OSErr setTweenEntryInitialConditions(QTAtomContainer tweenSample, long tweenID,
- void *initialData, long initialDataSize);
-
- OSErr addTweenEntryToInputMapEntry(QTAtomContainer inputMap, long referenceIndex, long tweenID,
- long tweenType, char *name);
-
- void main(void)
- {
- TQ3Point3D cameraFrom = { 0.0, 0.0, 30.0 };
- TQ3Point3D cameraTo = { 0.0, 0.0, 0.0 };
- TQ3Vector3D cameraUp = { 0.0, 1.0, 0.0 };
-
- OSErr err = noErr;
- OSType types;
- StandardFileReply reply;
- Movie newMovie;
- ThreeDeeDescriptionHandle sampleDescription = nil;
- short fref;
- AliasHandle alias = nil;
- long eof;
- Movie theMovie;
- Track threeDeeTrack, tweenTrack;
- Media threeDeeMedia, tweenMedia;
- FSSpec movieFSS;
- short movieResRef;
- QTAtomContainer tweenSample;
- TQ3CameraData tweenCamera;
- long referenceIndex1;
- QTAtomContainer inputMap;
-
- InitGraf(&qd.thePort);
- InitFonts();
- InitWindows();
- InitMenus();
- TEInit();
- InitDialogs(0L);
- InitCursor();
- MaxApplZone();
-
- EnterMovies();
-
- // ask user for a file
- types = '3DMF';
- StandardGetFilePreview(nil, 1, &types, &reply);
- if (!reply.sfGood) return;
-
- // figure out the size of the file
- FSpOpenDF(&reply.sfFile, fsRdPerm, &fref);
- GetEOF(fref, &eof);
- FSClose(fref);
-
- // make an alias to the file (QuickTime term: data reference)
- NewAliasMinimal(&reply.sfFile, &alias);
-
- // make up a sample description for the 3d media
- sampleDescription = (ThreeDeeDescriptionHandle)NewHandleClear(sizeof(ThreeDeeDescription));
- if (err = MemError()) return;
- (**sampleDescription).descSize = sizeof(ThreeDeeDescription);
-
- // create a movie file
- FSMakeFSSpec(0, 0, "\p3D Animated Camera Movie File", &movieFSS);
- err = CreateMovieFile(&movieFSS, 'TVOD', -1, createMovieFileDeleteCurFile, &movieResRef, &theMovie);
- if (err) return;
-
- // make up a 3d track, and media, very quickly
- threeDeeTrack = NewMovieTrack(theMovie, 320 << 16, 240 << 16, 0); // 320x240 pixels in size
- threeDeeMedia = NewTrackMedia(threeDeeTrack, 'qd3d', 1000, (Handle)alias, rAliasType); // make up a media that points to the 3dmf file
-
- // add the 3dmf file as a sample to the media (5 seconds long second long)
- err = AddMediaSampleReference(threeDeeMedia, 0, eof, 5000, (SampleDescriptionHandle)sampleDescription,
- 1, 0, nil);
- if (err) return;
-
- // add the 3d media into the track
- InsertMediaIntoTrack(threeDeeTrack, 0, 0, GetMediaDuration(threeDeeMedia), 1L << 16);
-
- // dispose unneeded things
- DisposeHandle((Handle)alias);
- DisposeHandle((Handle)sampleDescription);
-
- // make up a tween track, and media, very quickly
- tweenTrack = NewMovieTrack(theMovie, 0, 0, 0);
- tweenMedia = NewTrackMedia(tweenTrack, TweenMediaType, 1000, (Handle)nil, 0); // make up a media that stores its data in the movie's file
-
- // make up an empty tween sample
- err = QTNewAtomContainer(&tweenSample);
- if (err) return;
-
- // add a tween entry to tween the camera
- tweenCamera.placement.cameraLocation = cameraFrom;
- tweenCamera.placement.pointOfInterest = cameraTo;
- tweenCamera.placement.upVector = cameraUp;
-
- tweenCamera.range.yon = 1000.0;
- tweenCamera.range.hither = 0.001;
-
- tweenCamera.viewPort.origin.x = -1.0;
- tweenCamera.viewPort.origin.y = 1.0;
- tweenCamera.viewPort.width = 2.0;
- tweenCamera.viewPort.height = 2.0;
-
- err = addTweenEntryToSample(tweenSample, 1, kTweenType3dCameraData, &tweenCamera, sizeof(tweenCamera));
- if (err) return;
-
- tweenCamera.placement.cameraLocation.x *= 5.0;
- tweenCamera.placement.cameraLocation.y *= 5.0;
- tweenCamera.placement.cameraLocation.z *= 5.0;
-
- err = setTweenEntryInitialConditions(tweenSample, 1, &tweenCamera, sizeof(tweenCamera));
- if (err) return;
-
- // make up a tween sample description
- sampleDescription = (ThreeDeeDescriptionHandle)NewHandleClear(sizeof(SampleDescription));
- if (err = MemError()) return;
- (**sampleDescription).descSize = sizeof(SampleDescription);
-
- // add the tween sample to the tween media
- err = BeginMediaEdits(tweenMedia);
- if (err) return;
-
- err = AddMediaSample(tweenMedia, tweenSample, 0, GetHandleSize(tweenSample), 5000, (SampleDescriptionHandle)sampleDescription, 1, 0, nil);
- if (err) return;
-
- err = EndMediaEdits(tweenMedia);
- if (err) return;
-
- // add the tween media into the track
- InsertMediaIntoTrack(tweenTrack, 0, 0, GetMediaDuration(tweenMedia), 1L << 16);
-
- // throw away a few things
- QTDisposeAtomContainer(tweenSample);
- DisposeHandle((Handle)sampleDescription);
-
- // create two links (references) between the 3d and tween tracks
- err = AddTrackReference(threeDeeTrack, tweenTrack, kTrackModifierReference, &referenceIndex1);
- if (err) return;
-
- // create an empty input map for the 3d track
- err = QTNewAtomContainer(&inputMap);
- if (err) return;
-
- err = addTweenEntryToInputMapEntry(inputMap, referenceIndex1, 1, kTrackModifierCameraData, nil);
- if (err) return;
-
- // attach the input map to the 3d media handler
- err = SetMediaInputMap(threeDeeMedia, inputMap);
- if (err) return;
-
- // throw away the input map
- QTDisposeAtomContainer(inputMap);
-
- // add the movie resource to the movie file
- err = AddMovieResource(theMovie, movieResRef, nil, nil);
- if (err) return;
-
- // close the movie file
- CloseMovieFile(movieResRef);
-
- // toss that movie too (automatically tosses all tracks, media, etc).
- DisposeMovie(theMovie);
- }
-
- OSErr addTweenEntryToSample(QTAtomContainer tweenSample, long tweenID, long tweenType,
- void *tweenData, long tweenDataSize)
- {
- OSErr err;
- QTAtom tweenAtom;
-
- // create entry for this tween in the sample
- err = QTInsertChild(tweenSample, kParentAtomIsContainer, kTweenEntry, tweenID, 0, 0, nil, &tweenAtom);
- if (err) goto bail;
-
- // define the type of this tween entry
- err = QTInsertChild(tweenSample, tweenAtom, kTweenType, 1, 0, sizeof(tweenType), &tweenType, nil);
- if (err) goto bail;
-
- // define the data for this tween entry
- err = QTInsertChild(tweenSample, tweenAtom, kTweenData, 1, 0, tweenDataSize, tweenData, nil);
- if (err) goto bail;
-
- bail:
- return err;
- }
-
- OSErr setTweenEntryStartOffset(QTAtomContainer tweenSample, long tweenID, TimeValue startOffset)
- {
- QTAtom tweenAtom;
-
- // look up the tween entry
- tweenAtom = QTFindChildByID(tweenSample, kParentAtomIsContainer, kTweenEntry, tweenID, nil);
- if (!tweenAtom)
- return paramErr;
-
- // add in the start offset
- return QTInsertChild(tweenSample, tweenAtom, kTweenStartOffset, 1, 0, sizeof(startOffset), &startOffset, nil);
- }
-
- OSErr setTweenEntryDuration(QTAtomContainer tweenSample, long tweenID, TimeValue duration)
- {
- QTAtom tweenAtom;
-
- // look up the tween entry
- tweenAtom = QTFindChildByID(tweenSample, kParentAtomIsContainer, kTweenEntry, tweenID, nil);
- if (!tweenAtom)
- return paramErr;
-
- // add in the start offset
- return QTInsertChild(tweenSample, tweenAtom, kTweenDuration, 1, 0, sizeof(duration), &duration, nil);
- }
-
- OSErr setTweenEntryInitialConditions(QTAtomContainer tweenSample, long tweenID,
- void *initialData, long initialDataSize)
- {
- QTAtom tweenAtom;
-
- // look up the tween entry
- tweenAtom = QTFindChildByID(tweenSample, kParentAtomIsContainer, kTweenEntry, tweenID, nil);
- if (!tweenAtom)
- return paramErr;
-
- // add in the initial data offset
- return QTInsertChild(tweenSample, tweenAtom, kTween3dInitialCondition, 1, 0, initialDataSize, initialData, nil);
- }
-
- OSErr addTweenEntryToInputMapEntry(QTAtomContainer inputMap, long referenceIndex, long tweenID,
- long tweenType, char *name)
- {
- OSErr err;
- QTAtom inputAtom;
-
- // add a input entry to the input mape
- err = QTInsertChild(inputMap, kParentAtomIsContainer, kTrackModifierInput, referenceIndex,
- 0, 0, nil, &inputAtom);
- if (err) goto bail;
-
- // set the type of the modifier input (for 3d, this is almost always kTrackModifierType3d4x4Matrix)
- err = QTInsertChild(inputMap, inputAtom, kTrackModifierType, 1, 0,
- sizeof(tweenType), &tweenType, nil);
- if (err) goto bail;
-
- // set the sub input id (the id of the tween entry)
- err = QTInsertChild(inputMap, inputAtom, kInputMapSubInputID, 1, 0,
- sizeof(tweenID), &tweenID, nil);
- if (err) goto bail;
-
- // define the name
- if (name) {
- long nameLen = 1;
- Ptr p = name;
-
- while (*p++)
- nameLen++;
-
- err = QTInsertChild(inputMap, inputAtom, kTrackModifierInputName, 1, 0,
- nameLen, name, nil);
- if (err) goto bail;
- }
-
- bail:
- return err;
- }
-